\documentclass[a4paper, 10pt]{article}

\usepackage[dutch]{babel}
\usepackage{parskip}

\title{Project Databases}
\author{Bas Ketsman \and Niki Vandesbosch \and Dimitri Surinx}


\begin{document}

\maketitle

\section{Inleiding en projectverloop}

Het doel van dit project is het analyseren van de data van de Vlaamse plenaire vergaderingen.
Het project werd initi\"eel opgedeeld in drie delen:
Clustering met als bedoeling interessante verschillen of gelijkenissen te bekomen met betrekking tot de activiteit van burgemeesters en niet-burgemeesters;
textclustering met als bedoeling de effectieve onderwerpen van personen naar boven te halen; en het analyseren van interrupties.

Uit deze eerste werd weinig interessant resultaat geboekt en na de eerste samenkomst is dan ook beslist hier niet verder op in te gaan. In de plaats werd er gefocust op het uitdrukken van een activiteitsgraad, niet alleen om verschillen tussen burgemeesters en niet-burgemeesters te bekomen, maar ook met betrekking tot mannen en vrouwen en de verschillende partijen. Ook association rules werden aangehaald als mogelijk extra te bekijken onderdeel, al waren de meningen hier over verdeeld.

Op de tweede en tevens laatste bijeenkomst werd beslist verder te focussen op de activiteitsgraad, textclustering en interruptie analyse. Verder werd integratie van de verschillende delen als een belangrijk punt aangehaald. Association rules zijn uiteindelijk niet meer in het project behandeld.

In de volgende paragrafen wordt kort ingegaan op de drie belangrijkste activiteiten die hebben plaatsgevonden in dit project: het opstellen van een activiteitsgraad, het uitvoeren van textclustering en het berekenen van interrupties.

\section{Activiteitsgraad}
\label{sec:activiteitsgraad}

Het doel van dit onderdeel is het toekennen van een realistische ``graad van activiteit'' aan alle deelnemers van de plenaire vergaderingen.

\begin{quote}
Wat is activiteit?
\end{quote}

Er is niet zoiets als een eenduidige definitie van het begrip activiteit. In plaats van zelf een (subjectieve) definitie voor dit begrip in te vullen, werd er bijgevolg voor gekozen om het begrip dynamisch invulbaar te maken door de gebruiker van de applicatie.
Concreet betekent dit dat er gebruik wordt gemaakt van een reeks parameters waarvan de waarden wel eerder ondubbelzinnig uit de database kunnen worden afgeleid en met activiteit in verband kunnen worden gebracht en hier dynamisch gewichten aan worden toegekend om tot een definitie van het begrip te komen

\subsection{Activiteitsparameters}

Er zijn verschillende parameters die uit de verslagen van de plenaire vergaderingen kunnen worden afgeleid en in verband kunnen worden gebracht met activiteit. Deze worden hieronder opgesomd en kort toegelicht.

\begin{itemize}
\item \textbf{Aanwezigheid}: Iemand hoeft niet altijd aanwezig te zijn om actief te kunnen zijn, maar iemand die nooit aanwezig is niet bepaald actief in deze vergaderingen. Daarom lijkt aanwezigheid een nuttige parameter om hierin op te nemen.

In de meeste verslagen worden expliciet de aanwezigen opgesomd. In verslagen waar dit niet het geval is kan worden nagegaan welke personen in het document voorkomen om een benadering hiervan te bekomen.

\item \textbf{(Co)initiatieven}:
Dit zijn de agendapunten die door een persoon worden aangebracht. 
Deze parameter werd afgeleid uit de vermeldingen van persoonsnamen in de titel van agendapunten. Sommige agendapunten worden aan personen gericht (bijvoorbeeld `vraag tot persoon X'), deze personen zijn natuurlijk geen initiatiefnemer en hebben geen invloed op deze parameter. 

Merk op dat een (co)initiatiefnemer niet noodzakelijk deelneemt aan het agendapunt, of zelfs maar aanwezig is tijdens de plenaire vergadering waarin het agenda punt wordt behandeld.

\item \textbf{Participatie in agendapunten}: 
Dit zijn de agendapunten waaraan de persoon actief heeft deelgenomen. Uit de data kan niet worden afgeleid of dit als spreker vooraan is, of als spreker op de tribune. Het gaat hier ook niet noodzakelijk om een eigen initiatief, maar dat kan wel het geval zijn.

\item \textbf{Onderbrekingen}:
Het aantal onderbrekingen dat een persoon uitvoert wordt ook als parameter beschouwd. Meer info over deze parameter kan worden gelezen in paragraaf~\ref{sec:interrupties}.

\item \textbf{Gemiddeld aantal woorden}:
Iemand die in ieder agendapunt weinig zegt, scoort veel hoger op de `participatie' parameter dan iemand die af en toe een uitgebreide bijdrage levert.
Deze parameter speelt hier op in door het gemiddeld aantal woorden per topic waaraan wordt deelgenomen te representeren.

\item \textbf{Initiatieven waaraan deelgenomen}:
Zoals eerder vermeld wordt er niet noodzakelijk deelgenomen aan een agendapunt dat op eigen/co\"initiatief werd aangebracht.  Deze parameter bevat het aantal initiatieven waaraan de persoon ook effectief deelneemt.
\end{itemize}

\subsection{Vergelijken van parameters}

De parameters zoals hiervoor besproken worden bijna allemaal uitgedrukt als een concreet aantal.
Dit maakt het echter moeilijk om waarden van verschillende parameters met elkaar te kunnen vergelijken.
Om dit probleem op te lossen werd er voor gekozen de parameters uit te drukken in de vorm van een percentage.
Aanwezigheid zou bijvoorbeeld kunnen worden uitgedrukt als het aantal aanwezigheden ten opzichte van het totale aantal gevoerde vergaderingen. 
Voor de andere parameters is dit echter niet zo vanzelfsprekend. We zouden bijvoorbeeld participatie kunnen uitdrukken als het aantal participaties ten opzichte van het totale aantal agendapunten. Deze methode leidt echter tot weinig zeggende resultaten waarbij de range van bepaalde waarden bijvoorbeeld varieert tussen 0 en 100 procent en anderen dan weer tussen 0 en 2 procent, waarbij 2 procent dus `erg hoog' zou betekenen \ldots 

Omdat het vergelijken van parameters op deze manier niet realistisch is werd van deze methode afgezien en worden de parameters uitgedrukt ten opzichte van de maximale waarde die voor die parameters voorkomen. Een persoon die `100\%' scoort op een bepaalde parameter heeft voor deze parameter dus de hoogste waarde die erin voorkomt, maar dit betekent dus \emph{niet} dat het onmogelijk is om in de toekomst beter te scoren voor die parameter!

\subsection{Dynamische gewichten}

Omdat er geen exacte definitie van activiteit bestaat werd er voor gekozen om deze definitie dynamisch instelbaar te maken door de mogelijkheid te bieden om gewichten aan de verschillende hierboven beschreven parameters te koppelen.

Concreet wordt de activiteitsgraad berekend op basis van de waarde van de verschillende parameters, vermenigvuldigd met hun respectievelijk (dynamisch) gewicht. De som van deze waarden wordt tenslotte herschaald tot een percentage en resulteert in de activiteitsgraad zoals gedefini\"eerd door de gebruiker.

Ook hier geldt dat een activiteitsgraad van $100\%$ dus niet betekent dat deze persoon niet actiever zou kunnen zijn, maar wel dat deze persoon de hoogste of (door afronding) bijna hoogste waarde heeft voor de beschouwde parameters, waarbij nu natuurlijk rekening moet worden gehouden met de opgegeven gewichten.

\subsection{Ranking}

Omdat de concrete  ``activiteitsgraad'' in weze nog steeds weinig zegt, werd er voor gekozen geen verdere analyses uit te voeren met betrekking tot de concrete percentages, maar wel met betrekking tot de ranking die op deze manier ontstaat.
Zo wordt er een vergelijking gemaakt van de activiteit tussen individuele personen, partijen, mannen en vrouwen, burgemeesters en niet burgemeesters. Verder werd de ranking opgedeeld in kwartielen en wordt de indeling van deze kwartielen geanalyseerd (partijen, geslacht en wel of niet burgemeester) alsook de omgekeerde analyze (de verdeling over de kwartielen per partij, geslacht, (niet) burgemeester).

\subsection{Activiteitsgraad en ranking doorheen de jaren}
Behalve een activiteitsgraad en ranking over de hele legislatuur heen, werd er ook een gelijkaardige berekening uitgevoerd om een activiteitsgraad en ranking te bekomen over de individuele jaren van de legislatuur. Deze worden eveneens in een grafiekje weergegeven.


\section{Interrupties}
\label{sec:interrupties}
\subsection{Vergaren van de data}
Vooraleer de onderbrekingsdata te vergaren uit de XML documenten, is het eerst nodig om te bepalen wat we verstaan onder een onderbreking en hoe we deze kunnen herkennen in de XML documenten.
Idealiter willen we dat elke keer dat een persoon iemand anders onderbreekt, al dan niet in het midden van een zin, dit ge\"identificeerd wordt. Helaas is dit niet mogelijk, aangezien enkel `in het midden van een zin' onderbrekingen sporadisch worden vermeldt aan de hand van drie puntjes. Andere onderbrekingen, zoals iemand onderbreken tussen twee zinnen in, zijn dus niet expliciet identificeerbaar. Om deze wel te herkennen moet wat we verstaan onder een onderbreking verruimd worden, zonder dat we daardoor te veel valse positieven introduceren, dus een onderbreking die niet herkend zou worden in de ideale situatie. Uiteindelijk hebben we besloten om te werken met `gesprek onderbrekingen', i.e. iemand onderbreekt het gesprek als hij \emph{niet} aan het woord is. Dit brengt wel enkele problemen met zich mee:
\begin{itemize}
	\item De voorzitter geeft zichzelf het woord niet en onderbreekt onder deze definitie altijd. Om dit te vermijden hebben we besloten om de onderbrekingen van de voorzitter niet te herkennen;
	\item Vraag/antwoord conversaties tussen twee personen worden herkend als onderbrekingen. Deze onderbrekingen zijn zeer moeilijk tot bijna niet te onderscheiden van normale onderbrekingen, dus hebben we besloten om deze wel te herkennen;
	\item Indien de persoon aan het woord onderbroken wordt en hij de onderbreker onderbreekt, zal deze \emph{niet} herkend worden. Dit omdat de persoon die aan het woord was vaak na een onderbreking zijn gesprek gewoon verder zet.
\end{itemize}
\subsection{Presentatie van de data}
De vergaarde data wordt gepresenteerd op een website, waarop we de data groeperen als volgt:
\begin{itemize}
	\item Een persoon onderbreekt welke personen;
	\item Welke personen onderbreken een persoon;
	\item Een persoon onderbreekt welke partijen;
	\item Welke partijen onderbreken een persoon;
	\item Welke partijen onderbreken welke partij;
	\item Een partij onderbreekt welke partijen;
	\item Gemiddeld aantal onderbrekingen per geslacht;
	\item Gemiddeld aantal onderbrekingen per functie (burgemeesters);
	\item Hoeveel procent van het geslacht heeft ooit onderbroken;
	\item Hoeveel procent van de burgemeesters heeft ooit onderbroken;
\end{itemize}
Elk van deze groeperingen wordt zowel tekstueel als visueel (a.d.h.v. google charts) weergegeven. 

Om de presentatie van de data te versnellen wordt veel van de data \emph{niet} `on the fly' berekend, maar wordt de effectieve onderbrekingsdata op voorhand berekend. Sommige data groeperingsquery's zijn erg intensief en worden dus ook op voorhand uitgevoerd en in de database opgeslaan. Dit wordt gedaan om de laadtijden van de pagina's drastisch te versnellen.
\section{Textclustering}
\label{sec:textclustering}
Het doel van deze paragraaf is om uit te leggen hoe we op basis van clustering bepaald hebben over welke onderwerpen de parlementsleden hebben gesproken.

\subsection{Stap 1: Bepalen van de invoer}
De eerste stap was het bepalen van de te clusteren tekst. We hebben ervoor gekozen om simpelweg alle besproken agendapunten te nemen met uitzondering van de agendapunten waarvan hun titel begint met een van onderstaande prefixen:

\begin{itemize}
\item Stemming nr.
\item Bijlagen
\item Opening van de vergadering
\item Mededeling van de voorzitter
\item Ingekomen van stukken mededelingen
\item Samenstelling van de commissies
\item Verontschuldigingen
\item Opening van de zitting
\item Regeling van de werkzaamheden
\item Boodschappen
\item Toespraak van de voorzitter
\end{itemize}

We hebben ervoor gekozen om deze agendapunten niet te laten meetellen in het clusteren omdat de inhoud van deze agendapunten niet zinvol is. Deze zouden dus ook geen nuttige onderwerpen kunnen opleveren voor het clustering. Er is een xquery voorzien die dit werk uitvoert, namelijk `calculateInputDataForClustering.xquery'.

\subsection{Stap 2: Clusteren van de invoer}
Nu dat de invoer voor ons clustering algoritme klaar is zijn we klaar voor het clusteren zelf. We hebben ervoor gekozen om gebruik te maken van de tool \emph{Carrot2} voor het clusteren. De reden dat we voor deze tool hebben gekozen in plaats van een andere is omdat deze tool erop voorzien is om Nederlandse teksten te clusteren. We maken gebruik van het \emph{KMeans} clustering algoritme. Dit algoritme zal de opgegeven agendapunten, die het meekrijgt als invoer, gaan opdelen in een aantal disjuncte clusters. Hoeveel clusters er precies worden gegenereerd zal het algoritme zelf bepalen, dit gebeurt voornamelijk op basis van het aantal opgegeven agendapunten, maar er zijn ook enkele andere parameters die hier (op een niet lineaire manier) een invloed op hebben.  Zo kan je bijvoorbeeld een maximum aantal clusters opgeven, maar dit houdt gewoon in dat indien er meer clusters worden gegenereerd dan het opgegeven maximum, de laatste n clusters worden weggelaten uit het resultaat. 

Om de kwaliteit van de clusters te verbeteren is het mogelijk om zogenaamde stopwoorden toe te voegen. Tijdens het clusteren zullen deze stopwoorden dan uit het resultaat weggelaten worden. Indien we stopwoorden willen toevoegen of verwijderen, dan kan dit door het bestand `carrot/resources/defaultStopwords.nl' aan te passen. Daarnaast is het ook mogelijk om op te geven hoe vaak een woord minstens moet voorkomen voordat het wordt opgenomen in het resultaat, dit wordt ingesteld met behulp van de parameter `DF\_THRESHOLD'. 

Een gegenereerde cluster bestaat uit twee elementen: een lijst van alle agendapunten die zich in de cluster bevinden en een label. Dit label bestaat uit een aantal kernwoorden, gescheiden door een spatie, die het cluster representeren. Het aantal kernwoorden is altijd een getal tussen 1 en 10 en kan worden opgegeven met behulp van de parameter `labelCount'. 

Er is een java programma geschreven dat het bovenstaand beschreven proces uitvoert. Dus eerst zal de invoer worden ingelezen uit de database, vervolgens worden de juiste parameters ingesteld en worden de correcte stopwoorden ingeladen en tot slot wordt dan het KMeans clustering algoritme uitgevoerd. Het Java programma kan worden uitgevoerd door de main functie in de klasse \emph{Clustering} aan te roepen.

\subsection{Stap 3: Verwerken van de gegenereerde clusters}
De laatste stap die ons resteert te doen is het koppelen van personen aan de clusters. Dit doen we door voor iedere cluster te gaan controleren of een persoon \'e\'en of meerdere kernwoorden vanuit het label van de cluster heeft gebruikt. Indien dat het geval is kennen we die cluster toe aan die persoon. Dit doen we dan voor alle personen en voor alle clusters. Dit proces wordt uitgevoerd door de query `calculateClusterData.xquery'

Nu dat de clusters aan personen zijn gekoppeld zijn we in staat om te gaan berekenen welke onderwerpen het meest besproken te zijn. Dit doen we door te tellen welk onderwerp door het meest aantal personen werd besproken. We kunnen ook een onderscheid maken tussen mannen en vrouwen, of burgemeesters en niet-burgemeesters. Al deze berekeningen moet echter enkel gebeuren indien er nieuwe agendapunten aan de database worden toegevoerd. Daarom worden al deze gegevens \'e\'enmaal berekend door de query `calculateMostPopularClusters.xquery', het resultaat wordt dan opgeslagen in de database in het bestand `clusterdataMostPopular.xml'.

\section{Overige}
\subsection{Focus op \'e\'en legislatuur}
Omdat we gebruik maken van allerhande extra data die niet rechtstreeks uit de bestanden van de plenaire vergaderingen zelf komen, is het moeilijk om de analyses voor verschillende periodes op te stellen.
Er werd daarom gekozen om te focussen op de huidige legislatuur (2009 - 2014) omdat hiervan wel over de nodige data wordt beschikt. Hoewel dit de enige periode is die wordt geanalyseerd werden de queries wel zo opgesteld dat met een minimum aan inspanningen (mits toevoeging van de juiste extra data) ook andere periodes kunnen worden gevisualiseerd. 

\subsection{Script}
Voor het berekenen van de Activiteits-parameters, Interrupties en Clusters hebben we verschillende query's geschreven die soms gebruik maken van de uitvoer van een andere query. Het is dus nodig dat deze query's in de juiste volgorde worden uitgevoerd. Om ervoor te zorgen dat hier geen vergissingen tegen kunnen gebeuren hebben we een sh-script geschreven. Dit script zal al deze query's automatisch in de correcte volgorde uitvoeren. Bovendien zal het clustering algoritme ook op het juiste moment worden aangeroepen. De resultaten worden onmiddellijk in de database opgeslagen zodat de web-interface die we hebben gemaakt onmiddellijk op de meest recente data kan werken. 

\subsection{Extra data}

Niet alle gebruikte data komt rechtstreeks uit de XML bestanden van de plenaire vergaderingen.
Er werd bijvoorbeeld een lijst van burgemeesters omgezet naar XML formaat en er werd een lijst van personen met hun partij en geslacht opgesteld om ook hier analyses op te kunnen uitvoeren.

\subsection{Google Charts / JQuery}
Voor het dynamische gedeelte van de website en het tonen van de charts werd er gebruik gemaakt van Google charts, Google image charts, JQuery, SVG plugin voor JQuery en UI plugin voor JQuery.

\section{Taakverdeling}
\paragraph{Bas Ketsman}
\begin{itemize}
\item Initieel werd er ge\"experimtenteerd met clustering via Weka. Hier werden echter weinig interessante resultaten mee gevonden en Al deze resultaten zijn uiteindelijk ook zichtbaar in de huidige uitwerking.
\item Omzetting van de lijst van burgemeesters 2007 naar XML.
\item Samenstelling van de XML lijst van volksvertegenwoordigers en regeringsleden samen met hun geslacht en politieke partij.
\item De (x)query om participatie en initiatieven af te leiden uit de database.
\item De (x)query waarmee de parameters i.v.m. activiteitsgraad uit de database worden afgeleid.
\item Opstelling van de layout.
\item Dynamische activiteitsgraad berekening met behulp van JQuery.
\item Uitzoeken van de werking en het gebruik van Google Charts.
\item Alle queries en resultaten rond activiteitsgraad.
\item De (x)queries i.v.m. resultaten per zittingsjaar.
\item Integratie.
\end{itemize}

\paragraph{Dimitri Surinx}
\begin{itemize}
\item Dimitri heeft volgende query's geschreven:
	\begin{itemize}	
	\item onderbrekingsdataquery
	\end{itemize}
\item Alle informatie i.v.m. Interrupties op de webpagina's, inclusief weergave van de data op de website aan de hand van plaintext en charts.
\item Ge\"experimenteerd met andere interruptie definities, deze gaven echter geen tot weinig resultaten en werden dus niet toevoegd aan de website.
\item Uitzoeken werking Google Charts.
\item Partijen.xml aangemaakt voor de kleuren van de partijen op de website.
\end{itemize}

\paragraph{Niki Vandesbosch}
\begin{itemize}
\item Niki heeft volgende query's geschreven:
	\begin{itemize}
	\item calculateInputDataForClustering
	\item calculateClusterData
	\item sortClusterDataBySpeakers
	\item calculateMostPopularClusters
	\end{itemize}
\item Alle informatie i.v.m. Clustering en onderwerpen op de webpagina's.
\item Het java programma voor het Clustering
\end{itemize}

\end{document}
